Skip to content

Improve memory consumption for cancelled connection attempts#159

Merged
WyriHaximus merged 1 commit intoreactphp:masterfrom
clue-labs:memory
Apr 23, 2018
Merged

Improve memory consumption for cancelled connection attempts#159
WyriHaximus merged 1 commit intoreactphp:masterfrom
clue-labs:memory

Conversation

@clue
Copy link
Member

@clue clue commented Apr 23, 2018

While debugging some very odd memory issues in a live application, I noticed that this component shows some unexpected memory consumption and memory would not immediately be freed as expected when a connection attempt is cancelled. Let's not call this a "memory leak", because memory was eventually freed, but this clearly caused some unexpected and significant memory growth.

One of the core issues has been located and addressed via reactphp/event-loop#164, but even with that patch applied, cancelling a pending connection attempt behaved a bit unexpected.

I've used the following script to demonstrate unreasonable memory growth:

<?php

use React\EventLoop\Factory;
use React\Socket\Connector;

require __DIR__ . '/../vendor/autoload.php';

$loop = Factory::create();
$connector = new Connector($loop, array('timeout' => false));

$loop->addPeriodicTimer(0.001, function () use ($connector) {
    $promise = $connector->connect('192.168.2.1:8080');
    $promise->cancel();
});

$loop->addPeriodicTimer(1.0, function () {
    echo memory_get_usage() . PHP_EOL;
});

$loop->run();

Initially this peaked at around 320 MB on my system. After applying the referenced patch, this went down significantly and fluctuated somewhere between 2 MB and 12 MB. After applying this patch, this script reports a constant memory consumption of around 1.2 MB.

This implementation includes some of the ideas discussed in reactphp/promise-timer#32, reactphp/promise#46 and #113. Eventually, we should look into providing a way to address this within our promise implementation.

My vote would to be get this in here now as it addresses a relevant memory issue and eventually address this in the upstream component (at which point this changeset also does no harm). :shipit:

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants